Skip to content

chore: restore code required to perform sync through bellatrix - #8700

Merged
wemeetagain merged 9 commits into
unstablefrom
nflaig/bellatrix-sync
Dec 18, 2025
Merged

chore: restore code required to perform sync through bellatrix#8700
wemeetagain merged 9 commits into
unstablefrom
nflaig/bellatrix-sync

Conversation

@nflaig

@nflaig nflaig commented Dec 16, 2025

Copy link
Copy Markdown
Member

Motivation

As noted in #8680 (comment) we cannot sync through bellatrix anymore. While I don't think it's a big deal it's simple enough to keep that functionality as that code is pretty isolated and won't get in our way during refactors and with gloas won't be part of the block processing pipeline anymore due to block/payload separation.

Description

Restore code required to perform sync through bellatrix

  • re-added isExecutionEnabled() and isMergeTransitionComplete() checks during block processing
  • enabled some spec tests again that were previously skipped
  • mostly copied original code removed in #8680 but cleaned up some comments and simplified a bit

@gemini-code-assist

Copy link
Copy Markdown
Contributor

Summary of Changes

Hello @nflaig, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request restores the necessary code paths to allow syncing through the Bellatrix fork, which was previously noted as a missing capability. The core of the change involves introducing new helper functions to accurately determine if the execution layer is enabled or if the merge transition is complete. These checks are then strategically applied across various modules, including block verification and fork choice, to ensure that execution-related logic is only engaged under the correct conditions. Additionally, the test suite has been updated to remove skips for scenarios that are now properly handled.

Highlights

  • Restored Bellatrix Sync Capability: Re-enabled the ability to sync through the Bellatrix fork, addressing a previous limitation where this functionality was inadvertently removed.
  • Introduced Execution State Checks: Added new utility functions, isExecutionEnabled and isMergeTransitionComplete, to precisely determine when execution layer logic should be applied based on the state and block context.
  • Integrated Conditional Execution Logic: Incorporated these new checks into critical modules such as block verification, fork choice, and execution payload processing to ensure that execution-related logic is only engaged under the correct conditions during and after the merge transition.
  • Updated Test Suite: Modified test skipping logic to reflect the restored functionality, removing previously skipped tests related to pre-merge execution scenarios that are now properly handled.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request restores the functionality to sync through the Bellatrix fork by reintroducing the isExecutionEnabled check. The changes involve adding this check in various places where execution payloads are handled and re-enabling related spec tests.

My review found a critical issue in the implementation of the new isExecutionEnabled function which would prevent syncing with blinded blocks during the merge transition. I've provided a suggestion to fix this. The rest of the changes look correct and consistent with the PR's goal.

Comment thread packages/state-transition/src/util/execution.ts
@nflaig

nflaig commented Dec 16, 2025

Copy link
Copy Markdown
Member Author

/gemini review

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request restores the functionality to sync through the Bellatrix fork by re-introducing checks for isExecutionEnabled() and isMergeTransitionComplete(). The changes correctly add these checks in block processing and fork choice logic, and also re-enable the corresponding spec tests.

My review found a critical issue in the implementation of the new isExecutionEnabled helper function which would prevent syncing with blinded transition blocks. I've left a specific comment with a suggested fix for this.

Comment thread packages/state-transition/src/util/execution.ts
@github-actions

github-actions Bot commented Dec 16, 2025

Copy link
Copy Markdown
Contributor

Performance Report

✔️ no performance regression detected

Full benchmark results
Benchmark suite Current: 5a6eaae Previous: f4236af Ratio
getPubkeys - index2pubkey - req 1000 vs - 250000 vc 1.1447 ms/op 1.1473 ms/op 1.00
getPubkeys - validatorsArr - req 1000 vs - 250000 vc 36.642 us/op 37.065 us/op 0.99
BLS verify - blst 1.4378 ms/op 775.07 us/op 1.86
BLS verifyMultipleSignatures 3 - blst 1.6767 ms/op 1.1610 ms/op 1.44
BLS verifyMultipleSignatures 8 - blst 2.4996 ms/op 1.6399 ms/op 1.52
BLS verifyMultipleSignatures 32 - blst 7.3094 ms/op 4.8546 ms/op 1.51
BLS verifyMultipleSignatures 64 - blst 11.118 ms/op 8.9920 ms/op 1.24
BLS verifyMultipleSignatures 128 - blst 16.997 ms/op 17.154 ms/op 0.99
BLS deserializing 10000 signatures 675.69 ms/op 664.18 ms/op 1.02
BLS deserializing 100000 signatures 6.7870 s/op 6.8705 s/op 0.99
BLS verifyMultipleSignatures - same message - 3 - blst 1.3370 ms/op 903.10 us/op 1.48
BLS verifyMultipleSignatures - same message - 8 - blst 1.9407 ms/op 991.78 us/op 1.96
BLS verifyMultipleSignatures - same message - 32 - blst 1.9433 ms/op 1.6253 ms/op 1.20
BLS verifyMultipleSignatures - same message - 64 - blst 2.5711 ms/op 2.5771 ms/op 1.00
BLS verifyMultipleSignatures - same message - 128 - blst 4.1771 ms/op 4.3323 ms/op 0.96
BLS aggregatePubkeys 32 - blst 18.933 us/op 19.319 us/op 0.98
BLS aggregatePubkeys 128 - blst 67.489 us/op 67.194 us/op 1.00
notSeenSlots=1 numMissedVotes=1 numBadVotes=10 41.774 ms/op 37.068 ms/op 1.13
notSeenSlots=1 numMissedVotes=0 numBadVotes=4 41.641 ms/op 37.076 ms/op 1.12
notSeenSlots=2 numMissedVotes=1 numBadVotes=10 31.294 ms/op 30.986 ms/op 1.01
getSlashingsAndExits - default max 72.757 us/op 68.975 us/op 1.05
getSlashingsAndExits - 2k 311.17 us/op 303.78 us/op 1.02
isKnown best case - 1 super set check 193.00 ns/op 204.00 ns/op 0.95
isKnown normal case - 2 super set checks 188.00 ns/op 199.00 ns/op 0.94
isKnown worse case - 16 super set checks 189.00 ns/op 199.00 ns/op 0.95
InMemoryCheckpointStateCache - add get delete 2.3190 us/op 2.3930 us/op 0.97
validate api signedAggregateAndProof - struct 1.5006 ms/op 1.3563 ms/op 1.11
validate gossip signedAggregateAndProof - struct 1.4986 ms/op 1.3848 ms/op 1.08
batch validate gossip attestation - vc 640000 - chunk 32 116.26 us/op 117.77 us/op 0.99
batch validate gossip attestation - vc 640000 - chunk 64 105.55 us/op 103.49 us/op 1.02
batch validate gossip attestation - vc 640000 - chunk 128 94.303 us/op 96.646 us/op 0.98
batch validate gossip attestation - vc 640000 - chunk 256 109.40 us/op 92.948 us/op 1.18
bytes32 toHexString 338.00 ns/op 349.00 ns/op 0.97
bytes32 Buffer.toString(hex) 234.00 ns/op 261.00 ns/op 0.90
bytes32 Buffer.toString(hex) from Uint8Array 437.00 ns/op 320.00 ns/op 1.37
bytes32 Buffer.toString(hex) + 0x 311.00 ns/op 237.00 ns/op 1.31
Object access 1 prop 0.11300 ns/op 0.12000 ns/op 0.94
Map access 1 prop 0.11400 ns/op 0.12000 ns/op 0.95
Object get x1000 5.2000 ns/op 5.4610 ns/op 0.95
Map get x1000 0.35600 ns/op 0.38400 ns/op 0.93
Object set x1000 29.165 ns/op 29.382 ns/op 0.99
Map set x1000 19.662 ns/op 20.758 ns/op 0.95
Return object 10000 times 0.22430 ns/op 0.23370 ns/op 0.96
Throw Error 10000 times 3.9238 us/op 4.1332 us/op 0.95
toHex 129.94 ns/op 137.47 ns/op 0.95
Buffer.from 115.51 ns/op 119.08 ns/op 0.97
shared Buffer 72.938 ns/op 82.611 ns/op 0.88
fastMsgIdFn sha256 / 200 bytes 1.7870 us/op 1.8100 us/op 0.99
fastMsgIdFn h32 xxhash / 200 bytes 184.00 ns/op 184.00 ns/op 1.00
fastMsgIdFn h64 xxhash / 200 bytes 363.00 ns/op 263.00 ns/op 1.38
fastMsgIdFn sha256 / 1000 bytes 5.7940 us/op 5.8380 us/op 0.99
fastMsgIdFn h32 xxhash / 1000 bytes 290.00 ns/op 276.00 ns/op 1.05
fastMsgIdFn h64 xxhash / 1000 bytes 305.00 ns/op 306.00 ns/op 1.00
fastMsgIdFn sha256 / 10000 bytes 51.804 us/op 51.478 us/op 1.01
fastMsgIdFn h32 xxhash / 10000 bytes 1.3300 us/op 1.3540 us/op 0.98
fastMsgIdFn h64 xxhash / 10000 bytes 1.1170 us/op 888.00 ns/op 1.26
100 bytes - compress - snappyjs 1.4456 us/op 1.2614 us/op 1.15
100 bytes - compress - snappy 1.1779 us/op 1.1161 us/op 1.06
100 bytes - compress - snappy-wasm 688.20 ns/op 965.16 ns/op 0.71
100 bytes - compress - snappy-wasm - prealloc 1.8578 us/op 1.0617 us/op 1.75
200 bytes - compress - snappyjs 1.5153 us/op 1.6438 us/op 0.92
200 bytes - compress - snappy 1.4687 us/op 1.3027 us/op 1.13
200 bytes - compress - snappy-wasm 1.0047 us/op 918.59 ns/op 1.09
200 bytes - compress - snappy-wasm - prealloc 1.7862 us/op 1.3771 us/op 1.30
300 bytes - compress - snappyjs 2.5772 us/op 2.0259 us/op 1.27
300 bytes - compress - snappy 1.5265 us/op 1.5214 us/op 1.00
300 bytes - compress - snappy-wasm 988.58 ns/op 840.39 ns/op 1.18
300 bytes - compress - snappy-wasm - prealloc 1.3674 us/op 1.2318 us/op 1.11
400 bytes - compress - snappyjs 2.4307 us/op 2.3105 us/op 1.05
400 bytes - compress - snappy 1.4348 us/op 1.5473 us/op 0.93
400 bytes - compress - snappy-wasm 1.0509 us/op 1.4397 us/op 0.73
400 bytes - compress - snappy-wasm - prealloc 1.4444 us/op 1.8778 us/op 0.77
500 bytes - compress - snappyjs 2.7277 us/op 3.0274 us/op 0.90
500 bytes - compress - snappy 1.3791 us/op 1.6931 us/op 0.81
500 bytes - compress - snappy-wasm 974.17 ns/op 1.0063 us/op 0.97
500 bytes - compress - snappy-wasm - prealloc 1.0931 us/op 1.4472 us/op 0.76
1000 bytes - compress - snappyjs 3.8687 us/op 7.0209 us/op 0.55
1000 bytes - compress - snappy 1.5978 us/op 1.8283 us/op 0.87
1000 bytes - compress - snappy-wasm 1.7385 us/op 1.7535 us/op 0.99
1000 bytes - compress - snappy-wasm - prealloc 1.8924 us/op 2.0946 us/op 0.90
10000 bytes - compress - snappyjs 36.160 us/op 24.082 us/op 1.50
10000 bytes - compress - snappy 22.880 us/op 23.466 us/op 0.98
10000 bytes - compress - snappy-wasm 25.598 us/op 14.717 us/op 1.74
10000 bytes - compress - snappy-wasm - prealloc 17.209 us/op 20.998 us/op 0.82
100 bytes - uncompress - snappyjs 761.70 ns/op 766.35 ns/op 0.99
100 bytes - uncompress - snappy 1.1588 us/op 1.1208 us/op 1.03
100 bytes - uncompress - snappy-wasm 668.50 ns/op 881.53 ns/op 0.76
100 bytes - uncompress - snappy-wasm - prealloc 1.2096 us/op 1.1642 us/op 1.04
200 bytes - uncompress - snappyjs 1.0718 us/op 1.2011 us/op 0.89
200 bytes - uncompress - snappy 1.7285 us/op 1.6939 us/op 1.02
200 bytes - uncompress - snappy-wasm 987.78 ns/op 1.0669 us/op 0.93
200 bytes - uncompress - snappy-wasm - prealloc 1.2741 us/op 1.4444 us/op 0.88
300 bytes - uncompress - snappyjs 948.59 ns/op 1.0551 us/op 0.90
300 bytes - uncompress - snappy 1.3329 us/op 1.3242 us/op 1.01
300 bytes - uncompress - snappy-wasm 904.27 ns/op 835.07 ns/op 1.08
300 bytes - uncompress - snappy-wasm - prealloc 1.1827 us/op 1.3637 us/op 0.87
400 bytes - uncompress - snappyjs 1.0880 us/op 1.1743 us/op 0.93
400 bytes - uncompress - snappy 1.2724 us/op 1.4966 us/op 0.85
400 bytes - uncompress - snappy-wasm 919.24 ns/op 912.86 ns/op 1.01
400 bytes - uncompress - snappy-wasm - prealloc 1.2694 us/op 1.0338 us/op 1.23
500 bytes - uncompress - snappyjs 1.8682 us/op 1.2881 us/op 1.45
500 bytes - uncompress - snappy 1.4521 us/op 1.4306 us/op 1.02
500 bytes - uncompress - snappy-wasm 983.11 ns/op 921.79 ns/op 1.07
500 bytes - uncompress - snappy-wasm - prealloc 1.3204 us/op 1.5296 us/op 0.86
1000 bytes - uncompress - snappyjs 2.0026 us/op 3.1292 us/op 0.64
1000 bytes - uncompress - snappy 1.6190 us/op 1.6043 us/op 1.01
1000 bytes - uncompress - snappy-wasm 1.1046 us/op 1.4448 us/op 0.76
1000 bytes - uncompress - snappy-wasm - prealloc 1.7467 us/op 1.5627 us/op 1.12
10000 bytes - uncompress - snappyjs 20.036 us/op 18.177 us/op 1.10
10000 bytes - uncompress - snappy 24.592 us/op 32.550 us/op 0.76
10000 bytes - uncompress - snappy-wasm 27.885 us/op 19.066 us/op 1.46
10000 bytes - uncompress - snappy-wasm - prealloc 18.069 us/op 32.487 us/op 0.56
send data - 1000 256B messages 13.208 ms/op 14.013 ms/op 0.94
send data - 1000 512B messages 16.314 ms/op 15.906 ms/op 1.03
send data - 1000 1024B messages 22.845 ms/op 21.125 ms/op 1.08
send data - 1000 1200B messages 26.605 ms/op 24.549 ms/op 1.08
send data - 1000 2048B messages 26.228 ms/op 25.043 ms/op 1.05
send data - 1000 4096B messages 30.598 ms/op 27.070 ms/op 1.13
send data - 1000 16384B messages 126.57 ms/op 122.54 ms/op 1.03
send data - 1000 65536B messages 240.43 ms/op 291.68 ms/op 0.82
enrSubnets - fastDeserialize 64 bits 864.00 ns/op 889.00 ns/op 0.97
enrSubnets - ssz BitVector 64 bits 325.00 ns/op 324.00 ns/op 1.00
enrSubnets - fastDeserialize 4 bits 121.00 ns/op 132.00 ns/op 0.92
enrSubnets - ssz BitVector 4 bits 396.00 ns/op 335.00 ns/op 1.18
prioritizePeers score -10:0 att 32-0.1 sync 2-0 226.14 us/op 231.20 us/op 0.98
prioritizePeers score 0:0 att 32-0.25 sync 2-0.25 249.15 us/op 261.41 us/op 0.95
prioritizePeers score 0:0 att 32-0.5 sync 2-0.5 358.27 us/op 375.67 us/op 0.95
prioritizePeers score 0:0 att 64-0.75 sync 4-0.75 678.12 us/op 693.87 us/op 0.98
prioritizePeers score 0:0 att 64-1 sync 4-1 807.32 us/op 839.47 us/op 0.96
array of 16000 items push then shift 1.5636 us/op 1.5496 us/op 1.01
LinkedList of 16000 items push then shift 7.1240 ns/op 7.0130 ns/op 1.02
array of 16000 items push then pop 72.437 ns/op 71.107 ns/op 1.02
LinkedList of 16000 items push then pop 6.9100 ns/op 6.8290 ns/op 1.01
array of 24000 items push then shift 2.3322 us/op 2.2753 us/op 1.03
LinkedList of 24000 items push then shift 7.2310 ns/op 7.0950 ns/op 1.02
array of 24000 items push then pop 101.97 ns/op 98.940 ns/op 1.03
LinkedList of 24000 items push then pop 6.8820 ns/op 6.8300 ns/op 1.01
intersect bitArray bitLen 8 5.5740 ns/op 5.4040 ns/op 1.03
intersect array and set length 8 32.685 ns/op 31.793 ns/op 1.03
intersect bitArray bitLen 128 25.158 ns/op 26.468 ns/op 0.95
intersect array and set length 128 537.54 ns/op 520.53 ns/op 1.03
bitArray.getTrueBitIndexes() bitLen 128 969.00 ns/op 999.00 ns/op 0.97
bitArray.getTrueBitIndexes() bitLen 248 1.7040 us/op 1.7330 us/op 0.98
bitArray.getTrueBitIndexes() bitLen 512 3.4750 us/op 3.5600 us/op 0.98
Full columns - reconstruct all 6 blobs 230.73 us/op 287.41 us/op 0.80
Full columns - reconstruct half of the blobs out of 6 139.01 us/op 122.11 us/op 1.14
Full columns - reconstruct single blob out of 6 32.590 us/op 31.724 us/op 1.03
Half columns - reconstruct all 6 blobs 259.66 ms/op 261.13 ms/op 0.99
Half columns - reconstruct half of the blobs out of 6 130.73 ms/op 132.62 ms/op 0.99
Half columns - reconstruct single blob out of 6 47.837 ms/op 49.696 ms/op 0.96
Full columns - reconstruct all 10 blobs 261.39 us/op 353.06 us/op 0.74
Full columns - reconstruct half of the blobs out of 10 150.73 us/op 150.99 us/op 1.00
Full columns - reconstruct single blob out of 10 29.617 us/op 30.737 us/op 0.96
Half columns - reconstruct all 10 blobs 427.89 ms/op 432.13 ms/op 0.99
Half columns - reconstruct half of the blobs out of 10 216.13 ms/op 220.75 ms/op 0.98
Half columns - reconstruct single blob out of 10 47.394 ms/op 48.258 ms/op 0.98
Full columns - reconstruct all 20 blobs 772.56 us/op 878.61 us/op 0.88
Full columns - reconstruct half of the blobs out of 20 258.17 us/op 388.25 us/op 0.66
Full columns - reconstruct single blob out of 20 30.041 us/op 30.289 us/op 0.99
Half columns - reconstruct all 20 blobs 851.50 ms/op 873.50 ms/op 0.97
Half columns - reconstruct half of the blobs out of 20 426.85 ms/op 436.02 ms/op 0.98
Half columns - reconstruct single blob out of 20 47.495 ms/op 47.669 ms/op 1.00
Set add up to 64 items then delete first 2.0233 us/op 2.0598 us/op 0.98
OrderedSet add up to 64 items then delete first 3.0017 us/op 3.0556 us/op 0.98
Set add up to 64 items then delete last 2.2535 us/op 2.3594 us/op 0.96
OrderedSet add up to 64 items then delete last 3.2463 us/op 3.5062 us/op 0.93
Set add up to 64 items then delete middle 2.2794 us/op 2.3699 us/op 0.96
OrderedSet add up to 64 items then delete middle 4.7915 us/op 5.0738 us/op 0.94
Set add up to 128 items then delete first 4.7316 us/op 4.8573 us/op 0.97
OrderedSet add up to 128 items then delete first 7.0386 us/op 7.1425 us/op 0.99
Set add up to 128 items then delete last 4.5257 us/op 4.8420 us/op 0.93
OrderedSet add up to 128 items then delete last 6.6446 us/op 7.2300 us/op 0.92
Set add up to 128 items then delete middle 4.4726 us/op 4.6664 us/op 0.96
OrderedSet add up to 128 items then delete middle 12.887 us/op 13.450 us/op 0.96
Set add up to 256 items then delete first 9.6264 us/op 10.257 us/op 0.94
OrderedSet add up to 256 items then delete first 14.900 us/op 15.370 us/op 0.97
Set add up to 256 items then delete last 9.4502 us/op 9.8591 us/op 0.96
OrderedSet add up to 256 items then delete last 13.661 us/op 14.719 us/op 0.93
Set add up to 256 items then delete middle 9.2094 us/op 9.5406 us/op 0.97
OrderedSet add up to 256 items then delete middle 39.784 us/op 41.114 us/op 0.97
pass gossip attestations to forkchoice per slot 2.4875 ms/op 2.5063 ms/op 0.99
forkChoice updateHead vc 100000 bc 64 eq 0 487.82 us/op 494.54 us/op 0.99
forkChoice updateHead vc 600000 bc 64 eq 0 2.9135 ms/op 2.9605 ms/op 0.98
forkChoice updateHead vc 1000000 bc 64 eq 0 4.8542 ms/op 4.9427 ms/op 0.98
forkChoice updateHead vc 600000 bc 320 eq 0 2.9212 ms/op 2.9669 ms/op 0.98
forkChoice updateHead vc 600000 bc 1200 eq 0 2.9406 ms/op 2.9947 ms/op 0.98
forkChoice updateHead vc 600000 bc 7200 eq 0 3.3236 ms/op 3.3557 ms/op 0.99
forkChoice updateHead vc 600000 bc 64 eq 1000 3.3223 ms/op 3.3777 ms/op 0.98
forkChoice updateHead vc 600000 bc 64 eq 10000 3.4381 ms/op 3.5068 ms/op 0.98
forkChoice updateHead vc 600000 bc 64 eq 300000 8.9186 ms/op 9.0560 ms/op 0.98
computeDeltas 1400000 validators 0% inactive 14.120 ms/op 14.395 ms/op 0.98
computeDeltas 1400000 validators 10% inactive 14.706 ms/op 13.540 ms/op 1.09
computeDeltas 1400000 validators 20% inactive 12.332 ms/op 12.610 ms/op 0.98
computeDeltas 1400000 validators 50% inactive 9.6650 ms/op 9.8885 ms/op 0.98
computeDeltas 2100000 validators 0% inactive 21.256 ms/op 21.758 ms/op 0.98
computeDeltas 2100000 validators 10% inactive 21.947 ms/op 20.339 ms/op 1.08
computeDeltas 2100000 validators 20% inactive 18.530 ms/op 18.970 ms/op 0.98
computeDeltas 2100000 validators 50% inactive 14.498 ms/op 14.890 ms/op 0.97
altair processAttestation - 250000 vs - 7PWei normalcase 1.8235 ms/op 1.8508 ms/op 0.99
altair processAttestation - 250000 vs - 7PWei worstcase 2.7562 ms/op 2.6954 ms/op 1.02
altair processAttestation - setStatus - 1/6 committees join 115.66 us/op 112.82 us/op 1.03
altair processAttestation - setStatus - 1/3 committees join 229.31 us/op 230.44 us/op 1.00
altair processAttestation - setStatus - 1/2 committees join 318.26 us/op 311.91 us/op 1.02
altair processAttestation - setStatus - 2/3 committees join 411.09 us/op 415.51 us/op 0.99
altair processAttestation - setStatus - 4/5 committees join 573.62 us/op 577.43 us/op 0.99
altair processAttestation - setStatus - 100% committees join 679.15 us/op 645.95 us/op 1.05
altair processBlock - 250000 vs - 7PWei normalcase 3.4610 ms/op 3.2229 ms/op 1.07
altair processBlock - 250000 vs - 7PWei normalcase hashState 17.513 ms/op 19.433 ms/op 0.90
altair processBlock - 250000 vs - 7PWei worstcase 28.639 ms/op 22.664 ms/op 1.26
altair processBlock - 250000 vs - 7PWei worstcase hashState 68.476 ms/op 55.484 ms/op 1.23
phase0 processBlock - 250000 vs - 7PWei normalcase 1.4553 ms/op 1.5384 ms/op 0.95
phase0 processBlock - 250000 vs - 7PWei worstcase 22.114 ms/op 19.712 ms/op 1.12
altair processEth1Data - 250000 vs - 7PWei normalcase 352.06 us/op 356.03 us/op 0.99
getExpectedWithdrawals 250000 eb:1,eth1:1,we:0,wn:0,smpl:15 6.9320 us/op 6.7030 us/op 1.03
getExpectedWithdrawals 250000 eb:0.95,eth1:0.1,we:0.05,wn:0,smpl:219 60.852 us/op 36.777 us/op 1.65
getExpectedWithdrawals 250000 eb:0.95,eth1:0.3,we:0.05,wn:0,smpl:42 16.150 us/op 10.135 us/op 1.59
getExpectedWithdrawals 250000 eb:0.95,eth1:0.7,we:0.05,wn:0,smpl:18 10.192 us/op 6.5200 us/op 1.56
getExpectedWithdrawals 250000 eb:0.1,eth1:0.1,we:0,wn:0,smpl:1020 243.83 us/op 135.39 us/op 1.80
getExpectedWithdrawals 250000 eb:0.03,eth1:0.03,we:0,wn:0,smpl:11777 1.9264 ms/op 1.7469 ms/op 1.10
getExpectedWithdrawals 250000 eb:0.01,eth1:0.01,we:0,wn:0,smpl:16384 2.2523 ms/op 2.2927 ms/op 0.98
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,smpl:16384 2.1546 ms/op 2.3617 ms/op 0.91
getExpectedWithdrawals 250000 eb:0,eth1:0,we:0,wn:0,nocache,smpl:16384 4.4098 ms/op 4.4539 ms/op 0.99
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,smpl:16384 2.3519 ms/op 2.3869 ms/op 0.99
getExpectedWithdrawals 250000 eb:0,eth1:1,we:0,wn:0,nocache,smpl:16384 4.4782 ms/op 4.7670 ms/op 0.94
Tree 40 250000 create 366.74 ms/op 362.74 ms/op 1.01
Tree 40 250000 get(125000) 121.91 ns/op 121.14 ns/op 1.01
Tree 40 250000 set(125000) 1.1986 us/op 1.1533 us/op 1.04
Tree 40 250000 toArray() 12.773 ms/op 12.140 ms/op 1.05
Tree 40 250000 iterate all - toArray() + loop 12.709 ms/op 12.411 ms/op 1.02
Tree 40 250000 iterate all - get(i) 42.198 ms/op 40.078 ms/op 1.05
Array 250000 create 2.5016 ms/op 2.4062 ms/op 1.04
Array 250000 clone - spread 813.81 us/op 783.52 us/op 1.04
Array 250000 get(125000) 0.34100 ns/op 0.33600 ns/op 1.01
Array 250000 set(125000) 0.48500 ns/op 0.34500 ns/op 1.41
Array 250000 iterate all - loop 60.231 us/op 61.240 us/op 0.98
phase0 afterProcessEpoch - 250000 vs - 7PWei 40.683 ms/op 42.012 ms/op 0.97
Array.fill - length 1000000 2.8613 ms/op 2.9245 ms/op 0.98
Array push - length 1000000 9.5793 ms/op 11.921 ms/op 0.80
Array.get 0.21413 ns/op 0.21795 ns/op 0.98
Uint8Array.get 0.21978 ns/op 0.22224 ns/op 0.99
phase0 beforeProcessEpoch - 250000 vs - 7PWei 14.652 ms/op 14.102 ms/op 1.04
altair processEpoch - mainnet_e81889 271.24 ms/op 247.10 ms/op 1.10
mainnet_e81889 - altair beforeProcessEpoch 15.215 ms/op 16.268 ms/op 0.94
mainnet_e81889 - altair processJustificationAndFinalization 5.3030 us/op 5.6310 us/op 0.94
mainnet_e81889 - altair processInactivityUpdates 3.6244 ms/op 3.8438 ms/op 0.94
mainnet_e81889 - altair processRewardsAndPenalties 17.824 ms/op 18.155 ms/op 0.98
mainnet_e81889 - altair processRegistryUpdates 619.00 ns/op 637.00 ns/op 0.97
mainnet_e81889 - altair processSlashings 208.00 ns/op 165.00 ns/op 1.26
mainnet_e81889 - altair processEth1DataReset 157.00 ns/op 163.00 ns/op 0.96
mainnet_e81889 - altair processEffectiveBalanceUpdates 1.3560 ms/op 4.0058 ms/op 0.34
mainnet_e81889 - altair processSlashingsReset 980.00 ns/op 817.00 ns/op 1.20
mainnet_e81889 - altair processRandaoMixesReset 1.0260 us/op 1.0880 us/op 0.94
mainnet_e81889 - altair processHistoricalRootsUpdate 158.00 ns/op 158.00 ns/op 1.00
mainnet_e81889 - altair processParticipationFlagUpdates 538.00 ns/op 490.00 ns/op 1.10
mainnet_e81889 - altair processSyncCommitteeUpdates 127.00 ns/op 129.00 ns/op 0.98
mainnet_e81889 - altair afterProcessEpoch 41.355 ms/op 43.988 ms/op 0.94
capella processEpoch - mainnet_e217614 843.98 ms/op 836.62 ms/op 1.01
mainnet_e217614 - capella beforeProcessEpoch 85.248 ms/op 82.256 ms/op 1.04
mainnet_e217614 - capella processJustificationAndFinalization 5.3460 us/op 5.7550 us/op 0.93
mainnet_e217614 - capella processInactivityUpdates 15.563 ms/op 17.605 ms/op 0.88
mainnet_e217614 - capella processRewardsAndPenalties 100.92 ms/op 94.526 ms/op 1.07
mainnet_e217614 - capella processRegistryUpdates 6.2490 us/op 6.2040 us/op 1.01
mainnet_e217614 - capella processSlashings 161.00 ns/op 165.00 ns/op 0.98
mainnet_e217614 - capella processEth1DataReset 164.00 ns/op 157.00 ns/op 1.04
mainnet_e217614 - capella processEffectiveBalanceUpdates 11.448 ms/op 15.758 ms/op 0.73
mainnet_e217614 - capella processSlashingsReset 791.00 ns/op 804.00 ns/op 0.98
mainnet_e217614 - capella processRandaoMixesReset 1.2710 us/op 1.0940 us/op 1.16
mainnet_e217614 - capella processHistoricalRootsUpdate 165.00 ns/op 161.00 ns/op 1.02
mainnet_e217614 - capella processParticipationFlagUpdates 558.00 ns/op 506.00 ns/op 1.10
mainnet_e217614 - capella afterProcessEpoch 112.83 ms/op 135.22 ms/op 0.83
phase0 processEpoch - mainnet_e58758 227.89 ms/op 257.16 ms/op 0.89
mainnet_e58758 - phase0 beforeProcessEpoch 54.860 ms/op 55.912 ms/op 0.98
mainnet_e58758 - phase0 processJustificationAndFinalization 7.3200 us/op 5.8890 us/op 1.24
mainnet_e58758 - phase0 processRewardsAndPenalties 23.637 ms/op 19.031 ms/op 1.24
mainnet_e58758 - phase0 processRegistryUpdates 3.6340 us/op 3.0890 us/op 1.18
mainnet_e58758 - phase0 processSlashings 242.00 ns/op 166.00 ns/op 1.46
mainnet_e58758 - phase0 processEth1DataReset 164.00 ns/op 163.00 ns/op 1.01
mainnet_e58758 - phase0 processEffectiveBalanceUpdates 917.65 us/op 1.1596 ms/op 0.79
mainnet_e58758 - phase0 processSlashingsReset 870.00 ns/op 849.00 ns/op 1.02
mainnet_e58758 - phase0 processRandaoMixesReset 1.0540 us/op 1.1840 us/op 0.89
mainnet_e58758 - phase0 processHistoricalRootsUpdate 184.00 ns/op 173.00 ns/op 1.06
mainnet_e58758 - phase0 processParticipationRecordUpdates 770.00 ns/op 843.00 ns/op 0.91
mainnet_e58758 - phase0 afterProcessEpoch 34.709 ms/op 36.391 ms/op 0.95
phase0 processEffectiveBalanceUpdates - 250000 normalcase 1.2028 ms/op 1.2770 ms/op 0.94
phase0 processEffectiveBalanceUpdates - 250000 worstcase 0.5 3.2124 ms/op 2.1601 ms/op 1.49
altair processInactivityUpdates - 250000 normalcase 11.890 ms/op 12.989 ms/op 0.92
altair processInactivityUpdates - 250000 worstcase 12.681 ms/op 12.824 ms/op 0.99
phase0 processRegistryUpdates - 250000 normalcase 4.7970 us/op 5.1300 us/op 0.94
phase0 processRegistryUpdates - 250000 badcase_full_deposits 413.39 us/op 266.38 us/op 1.55
phase0 processRegistryUpdates - 250000 worstcase 0.5 73.177 ms/op 76.827 ms/op 0.95
altair processRewardsAndPenalties - 250000 normalcase 15.513 ms/op 17.070 ms/op 0.91
altair processRewardsAndPenalties - 250000 worstcase 19.748 ms/op 16.689 ms/op 1.18
phase0 getAttestationDeltas - 250000 normalcase 6.5661 ms/op 5.9192 ms/op 1.11
phase0 getAttestationDeltas - 250000 worstcase 5.6608 ms/op 5.9000 ms/op 0.96
phase0 processSlashings - 250000 worstcase 120.03 us/op 104.86 us/op 1.14
altair processSyncCommitteeUpdates - 250000 10.784 ms/op 11.312 ms/op 0.95
BeaconState.hashTreeRoot - No change 196.00 ns/op 205.00 ns/op 0.96
BeaconState.hashTreeRoot - 1 full validator 92.692 us/op 76.105 us/op 1.22
BeaconState.hashTreeRoot - 32 full validator 1.5148 ms/op 888.29 us/op 1.71
BeaconState.hashTreeRoot - 512 full validator 8.4299 ms/op 7.5179 ms/op 1.12
BeaconState.hashTreeRoot - 1 validator.effectiveBalance 109.61 us/op 113.58 us/op 0.97
BeaconState.hashTreeRoot - 32 validator.effectiveBalance 1.8739 ms/op 1.5062 ms/op 1.24
BeaconState.hashTreeRoot - 512 validator.effectiveBalance 22.973 ms/op 15.714 ms/op 1.46
BeaconState.hashTreeRoot - 1 balances 88.881 us/op 68.509 us/op 1.30
BeaconState.hashTreeRoot - 32 balances 1.2564 ms/op 704.43 us/op 1.78
BeaconState.hashTreeRoot - 512 balances 6.3885 ms/op 6.0405 ms/op 1.06
BeaconState.hashTreeRoot - 250000 balances 181.16 ms/op 142.24 ms/op 1.27
aggregationBits - 2048 els - zipIndexesInBitList 20.556 us/op 21.423 us/op 0.96
regular array get 100000 times 24.210 us/op 25.371 us/op 0.95
wrappedArray get 100000 times 24.169 us/op 25.368 us/op 0.95
arrayWithProxy get 100000 times 14.413 ms/op 14.606 ms/op 0.99
ssz.Root.equals 23.282 ns/op 24.256 ns/op 0.96
byteArrayEquals 22.632 ns/op 23.583 ns/op 0.96
Buffer.compare 9.7390 ns/op 10.112 ns/op 0.96
processSlot - 1 slots 10.655 us/op 10.931 us/op 0.97
processSlot - 32 slots 2.5330 ms/op 2.1976 ms/op 1.15
getEffectiveBalanceIncrementsZeroInactive - 250000 vs - 7PWei 3.5862 ms/op 4.8036 ms/op 0.75
getCommitteeAssignments - req 1 vs - 250000 vc 1.8678 ms/op 1.9441 ms/op 0.96
getCommitteeAssignments - req 100 vs - 250000 vc 3.6958 ms/op 3.7819 ms/op 0.98
getCommitteeAssignments - req 1000 vs - 250000 vc 3.9416 ms/op 4.0719 ms/op 0.97
findModifiedValidators - 10000 modified validators 503.57 ms/op 392.88 ms/op 1.28
findModifiedValidators - 1000 modified validators 401.26 ms/op 563.27 ms/op 0.71
findModifiedValidators - 100 modified validators 245.37 ms/op 242.23 ms/op 1.01
findModifiedValidators - 10 modified validators 207.83 ms/op 196.43 ms/op 1.06
findModifiedValidators - 1 modified validators 132.60 ms/op 148.46 ms/op 0.89
findModifiedValidators - no difference 176.27 ms/op 153.54 ms/op 1.15
migrate state 1500000 validators, 3400 modified, 2000 new 1.1469 s/op 1.1964 s/op 0.96
RootCache.getBlockRootAtSlot - 250000 vs - 7PWei 4.1600 ns/op 4.5200 ns/op 0.92
state getBlockRootAtSlot - 250000 vs - 7PWei 527.51 ns/op 589.76 ns/op 0.89
computeProposerIndex 100000 validators 1.4871 ms/op 1.6954 ms/op 0.88
getNextSyncCommitteeIndices 1000 validators 113.62 ms/op 140.10 ms/op 0.81
getNextSyncCommitteeIndices 10000 validators 116.22 ms/op 138.72 ms/op 0.84
getNextSyncCommitteeIndices 100000 validators 115.70 ms/op 127.23 ms/op 0.91
computeProposers - vc 250000 641.45 us/op 709.43 us/op 0.90
computeEpochShuffling - vc 250000 40.947 ms/op 44.106 ms/op 0.93
getNextSyncCommittee - vc 250000 10.232 ms/op 11.069 ms/op 0.92
nodejs block root to RootHex using toHex 148.15 ns/op 155.72 ns/op 0.95
nodejs block root to RootHex using toRootHex 80.219 ns/op 87.957 ns/op 0.91
nodejs fromHex(blob) 387.82 us/op 260.34 us/op 1.49
nodejs fromHexInto(blob) 693.28 us/op 720.14 us/op 0.96
nodejs block root to RootHex using the deprecated toHexString 530.99 ns/op 577.32 ns/op 0.92
browser block root to RootHex using toHex 265.25 ns/op 300.60 ns/op 0.88
browser block root to RootHex using toRootHex 158.50 ns/op 172.03 ns/op 0.92
browser fromHex(blob) 1.2929 ms/op 1.2255 ms/op 1.05
browser fromHexInto(blob) 691.40 us/op 732.75 us/op 0.94
browser block root to RootHex using the deprecated toHexString 364.31 ns/op 436.09 ns/op 0.84

by benchmarkbot/action

@nflaig

nflaig commented Dec 16, 2025

Copy link
Copy Markdown
Member Author

deployed to feat4-mainnet-hzax41 and it's syncing fine now

@nflaig
nflaig marked this pull request as ready for review December 16, 2025 23:09
@nflaig
nflaig requested a review from a team as a code owner December 16, 2025 23:09
@wemeetagain
wemeetagain merged commit 84b481d into unstable Dec 18, 2025
19 of 24 checks passed
@wemeetagain
wemeetagain deleted the nflaig/bellatrix-sync branch December 18, 2025 23:00
@codecov

codecov Bot commented Dec 18, 2025

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 52.12%. Comparing base (aceb5b7) to head (3acd00d).
⚠️ Report is 5 commits behind head on unstable.

Additional details and impacted files
@@            Coverage Diff            @@
##           unstable    #8700   +/-   ##
=========================================
  Coverage     52.12%   52.12%           
=========================================
  Files           848      848           
  Lines         64948    64948           
  Branches       4783     4783           
=========================================
  Hits          33853    33853           
  Misses        31026    31026           
  Partials         69       69           
🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@wemeetagain

Copy link
Copy Markdown
Member

🎉 This PR is included in v1.39.0 🎉

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants